
#include "Perus.h"




void PAPERPLANE::PaivitaFysiikka( MAAILMA Maailma, BONUS &Bon )
{
    VEKTORI LahtoKiihtyvyysV = Objekti.AsentoM.EteenV();
    LahtoKiihtyvyysV.AsetaPituus( HeittoVoima ); 
    if(HeittoVoima == 0)LahtoKiihtyvyysV.NollaVektoriksi(); HeittoVoima = 0;
    VEKTORI NosteV = Maailma.AnnaNostovoima( *this );
    VEKTORI IlmanvastusV = Maailma.AnnaIlmanvastusvoima( *this );
    VEKTORI PainovoimaKiihtyvyysV = Maailma.AnnaPainovoimaKiihtyvyys();
    

    KiihtyvyysV = LahtoKiihtyvyysV;
    KiihtyvyysV.Lisaa( IlmanvastusV );
    KiihtyvyysV.Lisaa( PainovoimaKiihtyvyysV );
    //KiihtyvyysV.Lisaa( NosteV );
    

    VEKTORI TempNopeusV = Objekti.AsentoM.EteenV(); TempNopeusV.Versoriksi();
    VEKTORI TempKiihtyvyysV = KiihtyvyysV;  TempKiihtyvyysV.Versoriksi();
    
    TempNopeusV.KerroLuvulla( Pistetulo( TempNopeusV, TempKiihtyvyysV ) * KiihtyvyysV.AnnaPituus() );
    //TempNopeusV.Lisaa( NosteV );

    
    
    VEKTORI VanhaNopeusV = Objekti.AsentoM.EteenV();
    VanhaNopeusV.AsetaPituus( NopeusV.AnnaPituus() );
    NopeusV = VanhaNopeusV;
    
    NopeusV.Lisaa( TempNopeusV );
    
    NopeusV.AsetaPituus( NopeusV.AnnaPituus() + Bon.PPNopeusLisa);
    Bon.PPNopeusLisa = 0;
    
    //NopeusV.AsetaPituus( 0.06 );
    
    Objekti.Sijainti.X += NopeusV.X;
    Objekti.Sijainti.Y += NopeusV.Y;
    Objekti.Sijainti.Z += NopeusV.Z;
    

    if(MassaKP > 90)  MassaKP = 90;
    if(MassaKP < -90) MassaKP = -90;
    if(OikeaPerasin > 90)  OikeaPerasin = 90;
    if(OikeaPerasin < -90) OikeaPerasin = -90;
    if(VasenPerasin > 90)  VasenPerasin = 90;
    if(VasenPerasin < -90) VasenPerasin = -90;
    
    AsteistaRadiaaniksi( MassaKP );
    AsteistaRadiaaniksi( VasenPerasin );
    AsteistaRadiaaniksi( OikeaPerasin );
    
    double Alfa, Beta, Gamma;
    //Beta = -sin(VasenPerasin)*2 - sin(OikeaPerasin)*2;
    //Gamma = sin(VasenPerasin)*2 - sin(OikeaPerasin)*2;
    
    Alfa = MassaKP;
    Beta = -VasenPerasin*1.0 - OikeaPerasin*1.0;
    Gamma = VasenPerasin*1.0 - OikeaPerasin*1.0;
    
    Objekti.AsentoM.PyoritaX( Beta*0.6 + Beta * NopeusV.AnnaPituus()*0.15 );
    Objekti.AsentoM.PyoritaZ( Gamma*0.6 + Gamma * NopeusV.AnnaPituus()*0.3 );
    Objekti.AsentoM.PyoritaY( Alfa*0.6 + Alfa * NopeusV.AnnaPituus()*0.3 );
    

    RadiaanistaAsteiksi( MassaKP );
    RadiaanistaAsteiksi( VasenPerasin );
    RadiaanistaAsteiksi( OikeaPerasin );

    MassaKP -= MassaKP*0.025;
    OikeaPerasin -= OikeaPerasin*0.04;
    VasenPerasin -= VasenPerasin*0.04;



    VEKTORI LokaaliYlosV = {Objekti.AsentoM.YlosV().X, Objekti.AsentoM.YlosV().Y, Objekti.AsentoM.YlosV().Z };
    VEKTORI GlobaaliYlosV = { 0, 1, 0};
    VEKTORI GlobaaliAlasV = { 0, -1, 0};
    VEKTORI GlobaaliEteenV = { 0, 0, 1};
    
    VEKTORI TavoiteAlasV = GlobaaliAlasV;
    double VektoreidenValinenKulma = acos( Pistetulo(Objekti.AsentoM.EteenV(), TavoiteAlasV) );

    RadiaanistaAsteiksi( VektoreidenValinenKulma );

    double PyoritusKulma = VektoreidenValinenKulma*0.1 / (NopeusV.AnnaPituus()*1000+2);

    if(VektorienEriavyys(GlobaaliAlasV, Objekti.AsentoM.OikealleV()) < 1 ) GlobaaliAlasV.X = 0.01;
    VEKTORI TestausV = Vektoritulo( GlobaaliAlasV, Objekti.AsentoM.OikealleV() );
    double TestausKulma = acos( Pistetulo(GlobaaliEteenV, Objekti.AsentoM.EteenV()) );
    RadiaanistaAsteiksi( TestausKulma );
    
    if(Objekti.AsentoM.EteenV().Z >= 0) PyoritusKulma *= -1;

    MATRIISI4X4 TempM = YksikkoMatriisiM4x4;
    
/*    
    VEKTORI KaantoV = { Objekti.AsentoM.EteenV().X, 0, Objekti.AsentoM.EteenV().Z };//uus
    VEKTORI YksV = { 0, 0, 1};//uus
    double KulmaYks = acos( Pistetulo(KaantoV,YksV ) / (KaantoV.AnnaPituus()*YksV.AnnaPituus()) );//uus
    RadiaanistaAsteiksi( KulmaYks );//uus
    TempM.PyoritaY( KulmaYks );//uus
   */
    TempM.PyoritaX( PyoritusKulma );
    
    Objekti.AsentoM.KerroMatriisi( Objekti.AsentoM.M, TempM.M);




    VEKTORI TavoiteYlosV = GlobaaliYlosV;
    VektoreidenValinenKulma = acos( Pistetulo(LokaaliYlosV, TavoiteYlosV) / LokaaliYlosV.AnnaPituus()*TavoiteYlosV.AnnaPituus() );
    double LiikaKulma = acos( Pistetulo(Objekti.AsentoM.EteenV(), TavoiteYlosV) / TavoiteYlosV.AnnaPituus() );

    RadiaanistaAsteiksi( VektoreidenValinenKulma );
    RadiaanistaAsteiksi( LiikaKulma );
        
    if(LiikaKulma>90)VektoreidenValinenKulma -= (LiikaKulma-90);
    if(LiikaKulma<90)VektoreidenValinenKulma -= (-LiikaKulma+90);

    TestausV = Vektoritulo( Objekti.AsentoM.EteenV(), TavoiteYlosV );
    TestausKulma = acos( Pistetulo(LokaaliYlosV, TestausV) / LokaaliYlosV.AnnaPituus() );
    RadiaanistaAsteiksi( TestausKulma );

    PyoritusKulma = VektoreidenValinenKulma*0.1 / (NopeusV.AnnaPituus()*700+1);
    if(SiipiAla == 1)PyoritusKulma = VektoreidenValinenKulma / (NopeusV.AnnaPituus()+10);
    
    if(TestausKulma >= 90)PyoritusKulma *= -1;

    Objekti.AsentoM.PyoritaZ( PyoritusKulma );


    /*
    VEKTORI LokaaliYlosV = {Objekti.AsentoM.YlosV().X, Objekti.AsentoM.YlosV().Y, Objekti.AsentoM.YlosV().Z };
    VEKTORI GlobaaliYlosV = { 0, 1, 0};
    double YlosVektoreidenValinenKulma = acos( Pistetulo(LokaaliYlosV, GlobaaliYlosV) / LokaaliYlosV.AnnaPituus() );

    RadiaanistaAsteiksi( YlosVektoreidenValinenKulma );
    YlosVektoreidenValinenKulma = YlosVektoreidenValinenKulma/60;
    
    VEKTORI PyoritusAkseli = Vektoritulo(LokaaliYlosV, GlobaaliYlosV);
    //if(Objekti.AsentoM.EteenV().Z > 0) PyoritusAkseli.KerroLuvulla( -1 );
    PyoritusAkseli.Versoriksi();
    PyoritusAkseli.X = 0;

    Objekti.AsentoM.PyoritaV( YlosVektoreidenValinenKulma, PyoritusAkseli );

    */
    
    OrthonormalizeMatrix(Objekti.AsentoM.M);
    //Objekti.AsentoM.Orthonormalisoi();
}












void PAPERPLANE::Alusta( char *TiedostoNimi )
{
    ifstream Tiedosto( TiedostoNimi );
    
    char Otsikko[512];
    char Sana[512];
    char *ApuSana;
    
    
    if(Tiedosto.is_open())
    {
        for(bool Valmista = false; !Valmista;)
        {
            Tiedosto.ignore( 1000, '#' );
            Tiedosto.getline( Otsikko, 99, ';');

            if(strcmp( Otsikko, "3D_MALLI") == 0)
            {
                Tiedosto.ignore( 99, '>' );
                Tiedosto.getline( Sana, 99, '\n' );
                Objekti.Malli3DNimi = new char [strlen(Sana)];
                for(int i=0; i<strlen(Sana);i++)
                    Objekti.Malli3DNimi[i] = Sana[i];
                PyyhiLoppu(Objekti.Malli3DNimi, ';'); //poistaa pienen bugin...
            }

            if(strcmp( Otsikko, "TEKSTUURI") == 0)
            {
                Tiedosto.ignore( 99, '>' );
                Tiedosto.getline( Sana, 99, '\n' );
                Objekti.TekstuurinNimi = new char [strlen(Sana)];
                for(int i=0; i<strlen(Sana);i++)
                    Objekti.TekstuurinNimi[i] = Sana[i];
                PyyhiLoppu(Objekti.TekstuurinNimi, ';');
            }

            if(strcmp( Otsikko, "PP") == 0)
            {
                Tiedosto.ignore( 99, '>' );
                Tiedosto.getline( Sana, 99, '\n' );
                Nimi = new char [strlen(Sana)];
                for(int i=0; i<strlen(Sana);i++)
                    Nimi[i] = Sana[i];
                PyyhiLoppu(Nimi, ';');
            }
            
            if(strcmp( Otsikko, "MASSA") == 0)
            {
                Tiedosto.ignore( 99, '>' );
                Tiedosto.getline( Sana, 99, '\n' );
                ApuSana = new char [strlen(Sana)];
                for(int i=0; i<strlen(Sana);i++)
                    ApuSana[i] = Sana[i];
                PyyhiLoppu(ApuSana, ';');
                Massa = atof(ApuSana);
            }            

            if(strcmp( Otsikko, "MASSAJAKAUMA") == 0)
            {
                Tiedosto.ignore( 99, '>' );
                Tiedosto.getline( Sana, 99, '\n' );
                ApuSana = new char [strlen(Sana)];
                for(int i=0; i<strlen(Sana);i++)
                    ApuSana[i] = Sana[i];
                PyyhiLoppu(ApuSana, ';');
                MassaKP = atof(ApuSana);
            }                        

            if(strcmp( Otsikko, "SIIPIALA") == 0)
            {
                Tiedosto.ignore( 99, '>' );
                Tiedosto.getline( Sana, 99, '\n' );
                ApuSana = new char [strlen(Sana)];
                for(int i=0; i<strlen(Sana);i++)
                    ApuSana[i] = Sana[i];
                PyyhiLoppu(ApuSana, ';');
                SiipiAla = atof(ApuSana);
            }       

            if(strcmp( Otsikko, "AERODYNAAMISUUS") == 0)
            {
                Tiedosto.ignore( 99, '>' );
                Tiedosto.getline( Sana, 99, '\n' );
                ApuSana = new char [strlen(Sana)];
                for(int i=0; i<strlen(Sana);i++)
                    ApuSana[i] = Sana[i];
                PyyhiLoppu(ApuSana, ';');
                AeroDyn = atof(ApuSana);
            }      
            
            if(strcmp( Otsikko, "END_OF_FILE") == 0)
            {
                Valmista = true;
            }            
        }

        VasenPerasin = 0;
        OikeaPerasin = 0;
        Objekti.Sijainti = NollaSijainti;
        Objekti.AsentoM = YksikkoMatriisiM4x4;
        Objekti.Skaalaus = 0.3;
        Objekti.NimetTarkistettu = false;
    }

}


void LataaPPt( PAPERPLANE *&PPPuskuri, int &PPLKM )
{

    char **TiedostoNimiLista;

    char Nimi[512];

    char *LatausLista;
    if(LataaLista( "Tiedostot\\LatausLista.txt", LatausLista ))
    {
        char *Ladattavat = strstr( LatausLista, "PAPERPLANE" );

        if(Ladattavat != NULL )
        {
            int LKM = 0;
            for(int i=0; Ladattavat[i] != '#'; i++){ if(Ladattavat[i] == '>'){ LKM++; } }
            PPLKM = LKM;

            TiedostoNimiLista = new char *[PPLKM];

            LKM = 0;
            for(int i=0; LKM < PPLKM; i++)
            {
                if(Ladattavat[i] == '>')
                {
                    i++;    //hypätään '>' yli
                    int NimenPituus = 0;
                    for(int BegPos = i; Ladattavat[i-1] != ';'; i++ ){ Nimi[i - BegPos] = Ladattavat[i]; NimenPituus++;}
                    TiedostoNimiLista[LKM] = new char [NimenPituus];
                    for(int n=0; n<NimenPituus; n++){ TiedostoNimiLista[LKM][n] = Nimi[n]; }
                    PyyhiLoppu(TiedostoNimiLista[LKM], ';'); //poistaa pienen bugin...

                    LKM++;
                }
            }
        }
    }

    PPPuskuri = new PAPERPLANE [PPLKM];
    for(int i=0; i<PPLKM; i++)
    {
        char TiedostoNimi[512] = {"Tiedostot\\PP\\"};
        strcat( TiedostoNimi, TiedostoNimiLista[i] );
        PPPuskuri[i].Alusta( TiedostoNimi );
    }
 
}

